{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.utils.data import DataLoader\n",
    "from torch import optim\n",
    "import torch\n",
    "import os\n",
    "from torch import nn\n",
    "from torchvision import datasets, transforms\n",
    "from visdom import Visdom\n",
    "from matplotlib import pyplot as plt\n",
    "import cv2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "transform = transforms.Compose([\n",
    "    transforms.RandomHorizontalFlip(),\n",
    "    transforms.RandomRotation(degrees=45),\n",
    "    transforms.Resize(size=56),\n",
    "    transforms.CenterCrop(size=56),\n",
    "    transforms.ToTensor()\n",
    "])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def accury(predictions, labels):\n",
    "    pred = torch.max(predictions.data, 1)[1]\n",
    "    rights = pred.eq(labels.data.view_as(pred)).sum()\n",
    "    return rights, len(labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class GenderModule(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(GenderModule, self).__init__()\n",
    "        self.conv1 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=3,\n",
    "                      kernel_size=3,\n",
    "                      stride=1,\n",
    "                      padding=1,\n",
    "                      out_channels=32), nn.ReLU(), nn.MaxPool2d(kernel_size=2))\n",
    "        self.conv2 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=32,\n",
    "                      kernel_size=3,\n",
    "                      stride=1,\n",
    "                      padding=1,\n",
    "                      out_channels=128), nn.ReLU(), nn.MaxPool2d(kernel_size=2))\n",
    "        self.out = nn.Linear(128 * 14 * 14, out_features=2)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = self.conv2(x)\n",
    "        x = x.view(x.size(0), -1)\n",
    "        x = self.out(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset ImageFolder\n",
      "    Number of datapoints: 47009\n",
      "    Root location: /mnt/zhao/python/torch-demo/gender/Training\n",
      "    StandardTransform\n",
      "Transform: Compose(\n",
      "               RandomHorizontalFlip(p=0.5)\n",
      "               RandomRotation(degrees=[-45.0, 45.0], interpolation=nearest, expand=False, fill=0)\n",
      "               Resize(size=56, interpolation=bilinear, max_size=None, antialias=warn)\n",
      "               CenterCrop(size=(56, 56))\n",
      "               ToTensor()\n",
      "           )\n"
     ]
    }
   ],
   "source": [
    "train_image = datasets.ImageFolder(os.path.join(os.getcwd(), \"Training\"),\n",
    "                                   transform=transform)\n",
    "valid_image = datasets.ImageFolder(os.path.join(os.getcwd(), \"Validation\"),\n",
    "                                   transform=transform)\n",
    "training_male_dataset = DataLoader(dataset=train_image, batch_size=8, shuffle=True)\n",
    "\n",
    "print(train_image)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting up a new session...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "use cuda\n",
      "0/5877/0 loss: 0.6833558082580566\n",
      "0/5877/200 loss: 0.5794782638549805\n",
      "0/5877/400 loss: 0.659278929233551\n",
      "0/5877/600 loss: 0.29783836007118225\n",
      "0/5877/800 loss: 0.5758782625198364\n",
      "0/5877/1000 loss: 0.5903341770172119\n",
      "0/5877/1200 loss: 0.3038962781429291\n",
      "0/5877/1400 loss: 0.2549745738506317\n",
      "0/5877/1600 loss: 0.3355080783367157\n",
      "0/5877/1800 loss: 0.3949930965900421\n",
      "0/5877/2000 loss: 0.1525389850139618\n",
      "0/5877/2200 loss: 0.07480262219905853\n",
      "0/5877/2400 loss: 0.35093748569488525\n",
      "0/5877/2600 loss: 0.2006540596485138\n",
      "0/5877/2800 loss: 0.24379286170005798\n",
      "0/5877/3000 loss: 0.6517955660820007\n",
      "0/5877/3200 loss: 0.5346391797065735\n",
      "0/5877/3400 loss: 0.6026328206062317\n",
      "0/5877/3600 loss: 0.10915888100862503\n",
      "0/5877/3800 loss: 0.216077521443367\n",
      "0/5877/4000 loss: 0.07560791820287704\n",
      "0/5877/4200 loss: 0.12705019116401672\n",
      "0/5877/4400 loss: 0.16353003680706024\n",
      "0/5877/4600 loss: 0.7815727591514587\n",
      "0/5877/4800 loss: 0.21500810980796814\n",
      "0/5877/5000 loss: 0.9538170695304871\n",
      "0/5877/5200 loss: 0.28820469975471497\n",
      "0/5877/5400 loss: 0.08299268782138824\n",
      "0/5877/5600 loss: 0.06375766545534134\n",
      "0/5877/5800 loss: 0.06231106072664261\n",
      "1/5877/0 loss: 0.13679097592830658\n",
      "1/5877/200 loss: 0.06219332665205002\n",
      "1/5877/400 loss: 0.06977611035108566\n",
      "1/5877/600 loss: 0.20730194449424744\n",
      "1/5877/800 loss: 0.1935877501964569\n",
      "1/5877/1000 loss: 0.03465426713228226\n",
      "1/5877/1200 loss: 0.399860143661499\n",
      "1/5877/1400 loss: 0.6908683180809021\n",
      "1/5877/1600 loss: 0.04969950020313263\n",
      "1/5877/1800 loss: 0.6081845760345459\n",
      "1/5877/2000 loss: 0.1346939653158188\n",
      "1/5877/2200 loss: 0.1533229500055313\n",
      "1/5877/2400 loss: 0.5179499387741089\n",
      "1/5877/2600 loss: 0.1292835921049118\n",
      "1/5877/2800 loss: 0.6388220191001892\n",
      "1/5877/3000 loss: 0.5070841908454895\n",
      "1/5877/3200 loss: 0.2745996117591858\n",
      "1/5877/3400 loss: 0.34735146164894104\n",
      "1/5877/3600 loss: 0.45398592948913574\n",
      "1/5877/3800 loss: 0.26394781470298767\n",
      "1/5877/4000 loss: 0.6481278538703918\n",
      "1/5877/4200 loss: 0.1733742654323578\n",
      "1/5877/4400 loss: 0.6081874370574951\n",
      "1/5877/4600 loss: 0.28421786427497864\n",
      "1/5877/4800 loss: 0.2495812177658081\n",
      "1/5877/5000 loss: 0.055156607180833817\n",
      "1/5877/5200 loss: 0.34612149000167847\n",
      "1/5877/5400 loss: 0.5076502561569214\n",
      "1/5877/5600 loss: 0.07650098204612732\n",
      "1/5877/5800 loss: 0.17529767751693726\n",
      "2/5877/0 loss: 0.058729782700538635\n",
      "2/5877/200 loss: 0.09718195348978043\n",
      "2/5877/400 loss: 0.21102824807167053\n",
      "2/5877/600 loss: 0.5260019898414612\n",
      "2/5877/800 loss: 0.06362152844667435\n",
      "2/5877/1000 loss: 0.12472911924123764\n",
      "2/5877/1200 loss: 0.1335667222738266\n",
      "2/5877/1400 loss: 0.16739095747470856\n",
      "2/5877/1600 loss: 0.3129563331604004\n",
      "2/5877/1800 loss: 0.21974453330039978\n",
      "2/5877/2000 loss: 0.5587882399559021\n",
      "2/5877/2200 loss: 0.24934417009353638\n",
      "2/5877/2400 loss: 0.05683978274464607\n",
      "2/5877/2600 loss: 0.3096286654472351\n",
      "2/5877/2800 loss: 0.20970211923122406\n",
      "2/5877/3000 loss: 0.09637181460857391\n",
      "2/5877/3200 loss: 0.5359176397323608\n",
      "2/5877/3400 loss: 0.40557360649108887\n",
      "2/5877/3600 loss: 0.10077176243066788\n",
      "2/5877/3800 loss: 0.5871759653091431\n",
      "2/5877/4000 loss: 0.11869532614946365\n",
      "2/5877/4200 loss: 0.34496796131134033\n",
      "2/5877/4400 loss: 0.21169818937778473\n",
      "2/5877/4600 loss: 0.19072845578193665\n",
      "2/5877/4800 loss: 0.12574534118175507\n",
      "2/5877/5000 loss: 0.12892712652683258\n",
      "2/5877/5200 loss: 0.163900226354599\n",
      "2/5877/5400 loss: 0.2847152054309845\n",
      "2/5877/5600 loss: 0.06489384174346924\n",
      "2/5877/5800 loss: 0.4990497827529907\n",
      "3/5877/0 loss: 0.12550294399261475\n",
      "3/5877/200 loss: 0.16478301584720612\n",
      "3/5877/400 loss: 0.5993039608001709\n",
      "3/5877/600 loss: 0.04200424253940582\n",
      "3/5877/800 loss: 0.09648410975933075\n",
      "3/5877/1000 loss: 0.020029708743095398\n",
      "3/5877/1200 loss: 0.12748897075653076\n",
      "3/5877/1400 loss: 0.4271381199359894\n",
      "3/5877/1600 loss: 0.05192543938755989\n",
      "3/5877/1800 loss: 0.1702587902545929\n",
      "3/5877/2000 loss: 0.05251765251159668\n",
      "3/5877/2200 loss: 0.032789696007966995\n",
      "3/5877/2400 loss: 0.6442714333534241\n",
      "3/5877/2600 loss: 0.20621246099472046\n",
      "3/5877/2800 loss: 0.15520237386226654\n",
      "3/5877/3000 loss: 0.06874016672372818\n",
      "3/5877/3200 loss: 0.08876433968544006\n",
      "3/5877/3400 loss: 0.017817193642258644\n",
      "3/5877/3600 loss: 0.030895249918103218\n",
      "3/5877/3800 loss: 0.5411095023155212\n",
      "3/5877/4000 loss: 0.3244459927082062\n",
      "3/5877/4200 loss: 0.26999667286872864\n",
      "3/5877/4400 loss: 0.03404122218489647\n",
      "3/5877/4600 loss: 0.15095877647399902\n",
      "3/5877/4800 loss: 0.08734800666570663\n",
      "3/5877/5000 loss: 0.047404684126377106\n",
      "3/5877/5200 loss: 0.1311180144548416\n",
      "3/5877/5400 loss: 0.30800995230674744\n",
      "3/5877/5600 loss: 0.2842709422111511\n",
      "3/5877/5800 loss: 0.24183502793312073\n",
      "4/5877/0 loss: 0.27619031071662903\n",
      "4/5877/200 loss: 0.06785915791988373\n",
      "4/5877/400 loss: 0.32011592388153076\n",
      "4/5877/600 loss: 0.40727731585502625\n",
      "4/5877/800 loss: 0.07531613111495972\n",
      "4/5877/1000 loss: 0.3044067323207855\n",
      "4/5877/1200 loss: 0.40957316756248474\n",
      "4/5877/1400 loss: 0.24786730110645294\n",
      "4/5877/1600 loss: 0.4153546094894409\n",
      "4/5877/1800 loss: 0.1019415408372879\n",
      "4/5877/2000 loss: 0.054702725261449814\n",
      "4/5877/2200 loss: 0.13236135244369507\n",
      "4/5877/2400 loss: 0.05104553699493408\n",
      "4/5877/2600 loss: 0.3204682469367981\n",
      "4/5877/2800 loss: 0.03812125325202942\n",
      "4/5877/3000 loss: 0.1472463756799698\n",
      "4/5877/3200 loss: 0.19999492168426514\n",
      "4/5877/3400 loss: 0.09399217367172241\n",
      "4/5877/3600 loss: 0.15984798967838287\n",
      "4/5877/3800 loss: 0.12389025092124939\n",
      "4/5877/4000 loss: 0.12354134023189545\n",
      "4/5877/4200 loss: 0.025614259764552116\n",
      "4/5877/4400 loss: 0.3161987364292145\n",
      "4/5877/4600 loss: 0.04963965713977814\n",
      "4/5877/4800 loss: 0.23163199424743652\n",
      "4/5877/5000 loss: 0.06254880875349045\n",
      "4/5877/5200 loss: 0.6056217551231384\n",
      "4/5877/5400 loss: 0.12418079376220703\n",
      "4/5877/5600 loss: 0.11605030298233032\n",
      "4/5877/5800 loss: 0.10873541235923767\n",
      "5/5877/0 loss: 0.14058654010295868\n",
      "5/5877/200 loss: 0.41319146752357483\n",
      "5/5877/400 loss: 0.09588563442230225\n",
      "5/5877/600 loss: 0.045016996562480927\n",
      "5/5877/800 loss: 0.0903317853808403\n",
      "5/5877/1000 loss: 0.07754336297512054\n",
      "5/5877/1200 loss: 0.11810468137264252\n",
      "5/5877/1400 loss: 0.21656030416488647\n",
      "5/5877/1600 loss: 0.1970304250717163\n",
      "5/5877/1800 loss: 0.051142726093530655\n",
      "5/5877/2000 loss: 0.08871593326330185\n",
      "5/5877/2200 loss: 0.04515188932418823\n",
      "5/5877/2400 loss: 0.7280828952789307\n",
      "5/5877/2600 loss: 0.05609045550227165\n",
      "5/5877/2800 loss: 0.08816955238580704\n",
      "5/5877/3000 loss: 0.5858455896377563\n",
      "5/5877/3200 loss: 0.24091467261314392\n",
      "5/5877/3400 loss: 0.032711584120988846\n",
      "5/5877/3600 loss: 0.2407575100660324\n",
      "5/5877/3800 loss: 0.18900352716445923\n",
      "5/5877/4000 loss: 0.15180028975009918\n",
      "5/5877/4200 loss: 0.25120458006858826\n",
      "5/5877/4400 loss: 0.3083476424217224\n",
      "5/5877/4600 loss: 0.3241269886493683\n",
      "5/5877/4800 loss: 0.4620714485645294\n",
      "5/5877/5000 loss: 0.09388120472431183\n",
      "5/5877/5200 loss: 0.052610158920288086\n",
      "5/5877/5400 loss: 0.20153748989105225\n",
      "5/5877/5600 loss: 0.20948347449302673\n",
      "5/5877/5800 loss: 0.20604641735553741\n",
      "6/5877/0 loss: 0.012938649393618107\n",
      "6/5877/200 loss: 0.08906859904527664\n",
      "6/5877/400 loss: 0.07152978330850601\n",
      "6/5877/600 loss: 0.19738784432411194\n",
      "6/5877/800 loss: 0.147186741232872\n",
      "6/5877/1000 loss: 0.03419638052582741\n",
      "6/5877/1200 loss: 0.07926205545663834\n",
      "6/5877/1400 loss: 0.33370789885520935\n",
      "6/5877/1600 loss: 0.08065412193536758\n",
      "6/5877/1800 loss: 0.24653233587741852\n",
      "6/5877/2000 loss: 0.08533769100904465\n",
      "6/5877/2200 loss: 0.021043987944722176\n",
      "6/5877/2400 loss: 0.061248812824487686\n",
      "6/5877/2600 loss: 0.08101392537355423\n",
      "6/5877/2800 loss: 0.030033506453037262\n",
      "6/5877/3000 loss: 0.268910676240921\n",
      "6/5877/3200 loss: 0.04313845932483673\n",
      "6/5877/3400 loss: 0.1811469942331314\n",
      "6/5877/3600 loss: 0.08892146497964859\n",
      "6/5877/3800 loss: 0.06224470213055611\n",
      "6/5877/4000 loss: 0.1807425320148468\n",
      "6/5877/4200 loss: 0.04825122281908989\n",
      "6/5877/4400 loss: 0.073954738676548\n",
      "6/5877/4600 loss: 0.056346595287323\n",
      "6/5877/4800 loss: 0.18499970436096191\n",
      "6/5877/5000 loss: 0.4533270299434662\n",
      "6/5877/5200 loss: 0.03301656246185303\n",
      "6/5877/5400 loss: 0.1230933889746666\n",
      "6/5877/5600 loss: 0.3397955894470215\n",
      "6/5877/5800 loss: 0.04855019599199295\n",
      "7/5877/0 loss: 0.011363725177943707\n",
      "7/5877/200 loss: 0.0034942487254738808\n",
      "7/5877/400 loss: 0.4028429388999939\n",
      "7/5877/600 loss: 0.12114311009645462\n",
      "7/5877/800 loss: 0.011666378006339073\n",
      "7/5877/1000 loss: 0.16457316279411316\n",
      "7/5877/1200 loss: 0.10128895938396454\n",
      "7/5877/1400 loss: 0.21882596611976624\n",
      "7/5877/1600 loss: 0.2247183620929718\n",
      "7/5877/1800 loss: 0.07602833211421967\n",
      "7/5877/2000 loss: 0.0754312202334404\n",
      "7/5877/2200 loss: 0.20866230130195618\n",
      "7/5877/2400 loss: 0.020761560648679733\n",
      "7/5877/2600 loss: 0.041752055287361145\n",
      "7/5877/2800 loss: 0.2775546610355377\n",
      "7/5877/3000 loss: 0.08167759329080582\n",
      "7/5877/3200 loss: 0.07406768202781677\n",
      "7/5877/3400 loss: 0.49072265625\n",
      "7/5877/3600 loss: 0.0454745776951313\n",
      "7/5877/3800 loss: 0.22163116931915283\n",
      "7/5877/4000 loss: 0.13646741211414337\n",
      "7/5877/4200 loss: 0.20017924904823303\n",
      "7/5877/4400 loss: 1.1828416585922241\n",
      "7/5877/4600 loss: 0.08844616264104843\n",
      "7/5877/4800 loss: 0.4247981607913971\n",
      "7/5877/5000 loss: 0.02482355386018753\n",
      "7/5877/5200 loss: 0.06864260882139206\n",
      "7/5877/5400 loss: 0.005009592045098543\n",
      "7/5877/5600 loss: 0.06209878996014595\n",
      "7/5877/5800 loss: 0.09244298189878464\n",
      "8/5877/0 loss: 0.7229308485984802\n",
      "8/5877/200 loss: 0.03124505653977394\n",
      "8/5877/400 loss: 0.27230432629585266\n",
      "8/5877/600 loss: 0.06010570377111435\n",
      "8/5877/800 loss: 0.10280095040798187\n",
      "8/5877/1000 loss: 0.22694708406925201\n",
      "8/5877/1200 loss: 0.08507965505123138\n",
      "8/5877/1400 loss: 0.05777546390891075\n",
      "8/5877/1600 loss: 0.03749217465519905\n",
      "8/5877/1800 loss: 0.4023798704147339\n",
      "8/5877/2000 loss: 0.19066274166107178\n",
      "8/5877/2200 loss: 0.26754820346832275\n",
      "8/5877/2400 loss: 0.45337092876434326\n",
      "8/5877/2600 loss: 0.08808571100234985\n",
      "8/5877/2800 loss: 0.21829380095005035\n",
      "8/5877/3000 loss: 0.09274446219205856\n",
      "8/5877/3200 loss: 0.05563754960894585\n",
      "8/5877/3400 loss: 0.07199898362159729\n",
      "8/5877/3600 loss: 0.08915440738201141\n",
      "8/5877/3800 loss: 0.07858990877866745\n",
      "8/5877/4000 loss: 0.20336675643920898\n",
      "8/5877/4200 loss: 0.007912415079772472\n",
      "8/5877/4400 loss: 0.15542879700660706\n",
      "8/5877/4600 loss: 0.3926083445549011\n",
      "8/5877/4800 loss: 0.239507257938385\n",
      "8/5877/5000 loss: 0.12983839213848114\n",
      "8/5877/5200 loss: 0.1617458462715149\n",
      "8/5877/5400 loss: 0.29968565702438354\n",
      "8/5877/5600 loss: 0.023256409913301468\n",
      "8/5877/5800 loss: 0.009393326938152313\n",
      "9/5877/0 loss: 0.20584280788898468\n",
      "9/5877/200 loss: 0.05964038893580437\n",
      "9/5877/400 loss: 0.2910464107990265\n",
      "9/5877/600 loss: 0.054212313145399094\n",
      "9/5877/800 loss: 0.1540357619524002\n",
      "9/5877/1000 loss: 0.010511055588722229\n",
      "9/5877/1200 loss: 0.1814863681793213\n",
      "9/5877/1400 loss: 0.0309480931609869\n",
      "9/5877/1600 loss: 0.022788461297750473\n",
      "9/5877/1800 loss: 0.24549421668052673\n",
      "9/5877/2000 loss: 0.04972673952579498\n",
      "9/5877/2200 loss: 0.03589700907468796\n",
      "9/5877/2400 loss: 0.18833650648593903\n",
      "9/5877/2600 loss: 0.08979152143001556\n",
      "9/5877/2800 loss: 0.03136684000492096\n",
      "9/5877/3000 loss: 0.12037841975688934\n",
      "9/5877/3200 loss: 0.12389124929904938\n",
      "9/5877/3400 loss: 0.0985582023859024\n",
      "9/5877/3600 loss: 0.07240431755781174\n",
      "9/5877/3800 loss: 0.21426697075366974\n",
      "9/5877/4000 loss: 0.08176283538341522\n",
      "9/5877/4200 loss: 0.04112249240279198\n",
      "9/5877/4400 loss: 0.14922107756137848\n",
      "9/5877/4600 loss: 0.026020053774118423\n",
      "9/5877/4800 loss: 0.09739139676094055\n",
      "9/5877/5000 loss: 0.7243490219116211\n",
      "9/5877/5200 loss: 0.018873555585741997\n",
      "9/5877/5400 loss: 0.5222160220146179\n",
      "9/5877/5600 loss: 0.13974039256572723\n",
      "9/5877/5800 loss: 0.0642208456993103\n",
      "10/5877/0 loss: 0.1800486445426941\n",
      "10/5877/200 loss: 0.02905416674911976\n",
      "10/5877/400 loss: 0.09741060435771942\n",
      "10/5877/600 loss: 0.06459790468215942\n",
      "10/5877/800 loss: 0.19116340577602386\n",
      "10/5877/1000 loss: 0.035761915147304535\n",
      "10/5877/1200 loss: 0.1765999048948288\n",
      "10/5877/1400 loss: 0.023560412228107452\n",
      "10/5877/1600 loss: 0.030251357704401016\n",
      "10/5877/1800 loss: 0.061550386250019073\n",
      "10/5877/2000 loss: 0.159852534532547\n",
      "10/5877/2200 loss: 0.23889684677124023\n",
      "10/5877/2400 loss: 0.5573319792747498\n",
      "10/5877/2600 loss: 0.1403156965970993\n",
      "10/5877/2800 loss: 0.3635173738002777\n",
      "10/5877/3000 loss: 0.008135299198329449\n",
      "10/5877/3200 loss: 0.1237141564488411\n",
      "10/5877/3400 loss: 0.042352475225925446\n",
      "10/5877/3600 loss: 0.023844966664910316\n",
      "10/5877/3800 loss: 0.4109116494655609\n",
      "10/5877/4000 loss: 0.014695769175887108\n",
      "10/5877/4200 loss: 0.016650643199682236\n",
      "10/5877/4400 loss: 0.02268371358513832\n",
      "10/5877/4600 loss: 0.02641144208610058\n",
      "10/5877/4800 loss: 0.02019554376602173\n",
      "10/5877/5000 loss: 0.40468060970306396\n",
      "10/5877/5200 loss: 0.21095775067806244\n",
      "10/5877/5400 loss: 0.16397984325885773\n",
      "10/5877/5600 loss: 0.03249834105372429\n",
      "10/5877/5800 loss: 0.7518113851547241\n",
      "11/5877/0 loss: 0.04574054852128029\n",
      "11/5877/200 loss: 0.00904828030616045\n",
      "11/5877/400 loss: 0.3121528625488281\n",
      "11/5877/600 loss: 0.013947805389761925\n",
      "11/5877/800 loss: 0.07802044600248337\n",
      "11/5877/1000 loss: 0.02874680422246456\n",
      "11/5877/1200 loss: 0.04743445664644241\n",
      "11/5877/1400 loss: 0.05038640648126602\n",
      "11/5877/1600 loss: 0.08743562549352646\n",
      "11/5877/1800 loss: 0.1001160517334938\n",
      "11/5877/2000 loss: 0.05917315557599068\n",
      "11/5877/2200 loss: 0.023013092577457428\n",
      "11/5877/2400 loss: 0.008939564228057861\n",
      "11/5877/2600 loss: 0.01957113668322563\n",
      "11/5877/2800 loss: 0.16493389010429382\n",
      "11/5877/3000 loss: 0.07546256482601166\n",
      "11/5877/3200 loss: 0.022462280467152596\n",
      "11/5877/3400 loss: 0.01545097678899765\n",
      "11/5877/3600 loss: 0.14524273574352264\n",
      "11/5877/3800 loss: 0.17361615598201752\n",
      "11/5877/4000 loss: 0.5617247223854065\n",
      "11/5877/4200 loss: 0.041354209184646606\n",
      "11/5877/4400 loss: 0.07181261479854584\n",
      "11/5877/4600 loss: 0.5749954581260681\n",
      "11/5877/4800 loss: 0.2570965886116028\n",
      "11/5877/5000 loss: 0.19151930510997772\n",
      "11/5877/5200 loss: 0.026231687515974045\n",
      "11/5877/5400 loss: 0.23766091465950012\n",
      "11/5877/5600 loss: 0.2197057455778122\n",
      "11/5877/5800 loss: 0.029104631394147873\n",
      "12/5877/0 loss: 0.20744365453720093\n",
      "12/5877/200 loss: 0.17218941450119019\n",
      "12/5877/400 loss: 0.1414356827735901\n",
      "12/5877/600 loss: 0.11485147476196289\n",
      "12/5877/800 loss: 0.01994609460234642\n",
      "12/5877/1000 loss: 0.19675394892692566\n",
      "12/5877/1200 loss: 0.3412337899208069\n",
      "12/5877/1400 loss: 0.01792563498020172\n",
      "12/5877/1600 loss: 0.0595894455909729\n",
      "12/5877/1800 loss: 0.15447212755680084\n",
      "12/5877/2000 loss: 0.01818583533167839\n",
      "12/5877/2200 loss: 0.0142293032258749\n",
      "12/5877/2400 loss: 0.04097479581832886\n",
      "12/5877/2600 loss: 0.0804162323474884\n",
      "12/5877/2800 loss: 0.011676913127303123\n",
      "12/5877/3000 loss: 0.19891482591629028\n",
      "12/5877/3200 loss: 0.12771493196487427\n",
      "12/5877/3400 loss: 0.02190595306456089\n",
      "12/5877/3600 loss: 0.010891562327742577\n",
      "12/5877/3800 loss: 0.06060320511460304\n",
      "12/5877/4000 loss: 0.1636083722114563\n",
      "12/5877/4200 loss: 0.08522571623325348\n",
      "12/5877/4400 loss: 0.011195537634193897\n",
      "12/5877/4600 loss: 0.299979031085968\n",
      "12/5877/4800 loss: 0.05255478620529175\n",
      "12/5877/5000 loss: 0.1654336005449295\n",
      "12/5877/5200 loss: 0.02456589974462986\n",
      "12/5877/5400 loss: 0.21601486206054688\n",
      "12/5877/5600 loss: 0.06881264597177505\n",
      "12/5877/5800 loss: 0.03647571802139282\n",
      "13/5877/0 loss: 0.07724348455667496\n",
      "13/5877/200 loss: 0.02530260570347309\n",
      "13/5877/400 loss: 0.559800922870636\n",
      "13/5877/600 loss: 0.11312735825777054\n",
      "13/5877/800 loss: 0.0043823919259011745\n",
      "13/5877/1000 loss: 0.01771317981183529\n",
      "13/5877/1200 loss: 0.016793588176369667\n",
      "13/5877/1400 loss: 0.3961462378501892\n",
      "13/5877/1600 loss: 0.032349929213523865\n",
      "13/5877/1800 loss: 0.3779985010623932\n",
      "13/5877/2000 loss: 0.05995515361428261\n",
      "13/5877/2200 loss: 0.1903725117444992\n",
      "13/5877/2400 loss: 0.5255691409111023\n",
      "13/5877/2600 loss: 0.09356077015399933\n",
      "13/5877/2800 loss: 0.1548565924167633\n",
      "13/5877/3000 loss: 0.08176453411579132\n",
      "13/5877/3200 loss: 0.05067182332277298\n",
      "13/5877/3400 loss: 0.031077338382601738\n",
      "13/5877/3600 loss: 0.04876682534813881\n",
      "13/5877/3800 loss: 0.00927668809890747\n",
      "13/5877/4000 loss: 0.18847058713436127\n",
      "13/5877/4200 loss: 0.15687118470668793\n",
      "13/5877/4400 loss: 0.4351908564567566\n",
      "13/5877/4600 loss: 0.029169628396630287\n",
      "13/5877/4800 loss: 0.10542033612728119\n",
      "13/5877/5000 loss: 0.021074943244457245\n",
      "13/5877/5200 loss: 0.0065904650837183\n",
      "13/5877/5400 loss: 0.028991756960749626\n",
      "13/5877/5600 loss: 0.0643974021077156\n",
      "13/5877/5800 loss: 0.2526581287384033\n",
      "14/5877/0 loss: 0.30696579813957214\n",
      "14/5877/200 loss: 0.3229675889015198\n",
      "14/5877/400 loss: 0.20307889580726624\n",
      "14/5877/600 loss: 0.051246799528598785\n",
      "14/5877/800 loss: 0.010523690842092037\n",
      "14/5877/1000 loss: 0.6102309823036194\n",
      "14/5877/1200 loss: 0.24876363575458527\n",
      "14/5877/1400 loss: 0.055137261748313904\n",
      "14/5877/1600 loss: 0.09709786623716354\n",
      "14/5877/1800 loss: 0.00928206741809845\n",
      "14/5877/2000 loss: 0.00977202970534563\n",
      "14/5877/2200 loss: 0.07958918064832687\n",
      "14/5877/2400 loss: 0.06948542594909668\n",
      "14/5877/2600 loss: 0.04646375775337219\n",
      "14/5877/2800 loss: 0.06096687912940979\n",
      "14/5877/3000 loss: 0.0077440813183784485\n",
      "14/5877/3200 loss: 0.025484468787908554\n",
      "14/5877/3400 loss: 0.4342923164367676\n",
      "14/5877/3600 loss: 0.17670495808124542\n",
      "14/5877/3800 loss: 0.08262941241264343\n",
      "14/5877/4000 loss: 0.10161252319812775\n",
      "14/5877/4200 loss: 0.5873867273330688\n",
      "14/5877/4400 loss: 0.007056048605591059\n",
      "14/5877/4600 loss: 0.15912692248821259\n",
      "14/5877/4800 loss: 0.11849132925271988\n",
      "14/5877/5000 loss: 0.4123929738998413\n",
      "14/5877/5200 loss: 0.07752221077680588\n",
      "14/5877/5400 loss: 0.05962832272052765\n",
      "14/5877/5600 loss: 0.07719436287879944\n",
      "14/5877/5800 loss: 0.008906057104468346\n",
      "15/5877/0 loss: 0.04377328231930733\n",
      "15/5877/200 loss: 0.07990051805973053\n",
      "15/5877/400 loss: 0.01086239330470562\n",
      "15/5877/600 loss: 0.06085068732500076\n",
      "15/5877/800 loss: 0.039498861879110336\n",
      "15/5877/1000 loss: 0.012630738317966461\n",
      "15/5877/1200 loss: 0.0629945695400238\n",
      "15/5877/1400 loss: 0.2849774956703186\n",
      "15/5877/1600 loss: 0.034196700900793076\n",
      "15/5877/1800 loss: 0.039682842791080475\n",
      "15/5877/2000 loss: 0.1635592132806778\n",
      "15/5877/2200 loss: 0.09602265805006027\n",
      "15/5877/2400 loss: 0.08572322130203247\n",
      "15/5877/2600 loss: 0.04947426915168762\n",
      "15/5877/2800 loss: 0.2631969749927521\n",
      "15/5877/3000 loss: 0.024850841611623764\n",
      "15/5877/3200 loss: 0.25214844942092896\n",
      "15/5877/3400 loss: 0.03571102395653725\n",
      "15/5877/3600 loss: 0.38595229387283325\n",
      "15/5877/3800 loss: 0.12329138815402985\n",
      "15/5877/4000 loss: 0.24256034195423126\n",
      "15/5877/4200 loss: 0.2104072868824005\n",
      "15/5877/4400 loss: 0.16422022879123688\n",
      "15/5877/4600 loss: 0.339063435792923\n",
      "15/5877/4800 loss: 0.045779600739479065\n",
      "15/5877/5000 loss: 0.11085671931505203\n",
      "15/5877/5200 loss: 0.29845908284187317\n",
      "15/5877/5400 loss: 0.09503930807113647\n",
      "15/5877/5600 loss: 0.09473997354507446\n",
      "15/5877/5800 loss: 0.01386240404099226\n",
      "16/5877/0 loss: 0.4960387647151947\n",
      "16/5877/200 loss: 0.11692748963832855\n",
      "16/5877/400 loss: 0.016520466655492783\n",
      "16/5877/600 loss: 0.08511512726545334\n",
      "16/5877/800 loss: 0.21074925363063812\n",
      "16/5877/1000 loss: 0.11753809452056885\n",
      "16/5877/1200 loss: 0.019885795190930367\n",
      "16/5877/1400 loss: 0.035886649042367935\n",
      "16/5877/1600 loss: 0.14887958765029907\n",
      "16/5877/1800 loss: 0.020570334047079086\n",
      "16/5877/2000 loss: 0.026742620393633842\n",
      "16/5877/2200 loss: 0.03558192774653435\n",
      "16/5877/2400 loss: 0.04302128031849861\n",
      "16/5877/2600 loss: 0.3315575122833252\n",
      "16/5877/2800 loss: 0.40343454480171204\n",
      "16/5877/3000 loss: 0.13988745212554932\n",
      "16/5877/3200 loss: 0.1388617902994156\n",
      "16/5877/3400 loss: 0.32235944271087646\n",
      "16/5877/3600 loss: 0.10471562296152115\n",
      "16/5877/3800 loss: 0.020080173388123512\n",
      "16/5877/4000 loss: 0.03924646973609924\n",
      "16/5877/4200 loss: 0.029012100771069527\n",
      "16/5877/4400 loss: 0.015376541763544083\n",
      "16/5877/4600 loss: 0.004414946306496859\n",
      "16/5877/4800 loss: 0.04006422683596611\n",
      "16/5877/5000 loss: 0.004202983807772398\n",
      "16/5877/5200 loss: 0.024072252213954926\n",
      "16/5877/5400 loss: 0.14024266600608826\n",
      "16/5877/5600 loss: 0.01241796463727951\n",
      "16/5877/5800 loss: 0.07032451033592224\n",
      "17/5877/0 loss: 0.045686304569244385\n",
      "17/5877/200 loss: 0.4003126323223114\n",
      "17/5877/400 loss: 0.0879225805401802\n",
      "17/5877/600 loss: 0.3248153626918793\n",
      "17/5877/800 loss: 0.009878990240395069\n",
      "17/5877/1000 loss: 0.4606453776359558\n",
      "17/5877/1200 loss: 0.045134011656045914\n",
      "17/5877/1400 loss: 0.04721856117248535\n",
      "17/5877/1600 loss: 0.17134085297584534\n",
      "17/5877/1800 loss: 0.00704115629196167\n",
      "17/5877/2000 loss: 0.635600209236145\n",
      "17/5877/2200 loss: 0.4102194011211395\n",
      "17/5877/2400 loss: 0.10327790677547455\n",
      "17/5877/2600 loss: 0.06449950486421585\n",
      "17/5877/2800 loss: 0.027057278901338577\n",
      "17/5877/3000 loss: 0.24853360652923584\n",
      "17/5877/3200 loss: 0.005088882986456156\n",
      "17/5877/3400 loss: 0.008282648399472237\n",
      "17/5877/3600 loss: 0.0458478182554245\n",
      "17/5877/3800 loss: 0.01341971568763256\n",
      "17/5877/4000 loss: 0.21175657212734222\n",
      "17/5877/4200 loss: 0.044266410171985626\n",
      "17/5877/4400 loss: 0.2940516769886017\n",
      "17/5877/4600 loss: 0.03217729926109314\n",
      "17/5877/4800 loss: 0.025194257497787476\n",
      "17/5877/5000 loss: 0.01921955868601799\n",
      "17/5877/5200 loss: 0.06582791358232498\n",
      "17/5877/5400 loss: 0.21096983551979065\n",
      "17/5877/5600 loss: 0.010269167833030224\n",
      "17/5877/5800 loss: 0.4358348250389099\n",
      "18/5877/0 loss: 0.07899503409862518\n",
      "18/5877/200 loss: 0.2036600559949875\n",
      "18/5877/400 loss: 0.020520830526947975\n",
      "18/5877/600 loss: 0.022551940754055977\n",
      "18/5877/800 loss: 0.038944799453020096\n",
      "18/5877/1000 loss: 0.024599485099315643\n",
      "18/5877/1200 loss: 0.008160646073520184\n",
      "18/5877/1400 loss: 0.08177472651004791\n",
      "18/5877/1600 loss: 0.0812796950340271\n",
      "18/5877/1800 loss: 0.19930677115917206\n",
      "18/5877/2000 loss: 0.0916367843747139\n",
      "18/5877/2200 loss: 0.14817138016223907\n",
      "18/5877/2400 loss: 0.02884840779006481\n",
      "18/5877/2600 loss: 0.12302479147911072\n",
      "18/5877/2800 loss: 0.058286603540182114\n",
      "18/5877/3000 loss: 0.7041497826576233\n",
      "18/5877/3200 loss: 0.1452065408229828\n",
      "18/5877/3400 loss: 0.6429168581962585\n",
      "18/5877/3600 loss: 0.024564282968640327\n",
      "18/5877/3800 loss: 0.6751314401626587\n",
      "18/5877/4000 loss: 0.03535056859254837\n",
      "18/5877/4200 loss: 0.01523728109896183\n",
      "18/5877/4400 loss: 0.22676485776901245\n",
      "18/5877/4600 loss: 0.17137247323989868\n",
      "18/5877/4800 loss: 0.11000924557447433\n",
      "18/5877/5000 loss: 0.02944299578666687\n",
      "18/5877/5200 loss: 0.4954696297645569\n",
      "18/5877/5400 loss: 0.178043395280838\n",
      "18/5877/5600 loss: 0.20195819437503815\n",
      "18/5877/5800 loss: 0.013198453933000565\n",
      "19/5877/0 loss: 0.08918595314025879\n",
      "19/5877/200 loss: 0.047773703932762146\n",
      "19/5877/400 loss: 0.02699969708919525\n",
      "19/5877/600 loss: 0.013769259676337242\n",
      "19/5877/800 loss: 0.3231465518474579\n",
      "19/5877/1000 loss: 0.2636384665966034\n",
      "19/5877/1200 loss: 0.040804050862789154\n",
      "19/5877/1400 loss: 0.0132089639082551\n",
      "19/5877/1600 loss: 0.035751499235630035\n",
      "19/5877/1800 loss: 0.5321369171142578\n",
      "19/5877/2000 loss: 0.14570721983909607\n",
      "19/5877/2200 loss: 0.019748926162719727\n",
      "19/5877/2400 loss: 0.06296373158693314\n",
      "19/5877/2600 loss: 0.07680509984493256\n",
      "19/5877/2800 loss: 0.10246169567108154\n",
      "19/5877/3000 loss: 0.0227897260338068\n",
      "19/5877/3200 loss: 0.19840258359909058\n",
      "19/5877/3400 loss: 0.1434142291545868\n",
      "19/5877/3600 loss: 0.010945574380457401\n",
      "19/5877/3800 loss: 0.21871784329414368\n",
      "19/5877/4000 loss: 0.298037052154541\n",
      "19/5877/4200 loss: 0.018061563372612\n",
      "19/5877/4400 loss: 0.4464203417301178\n",
      "19/5877/4600 loss: 0.09318657219409943\n",
      "19/5877/4800 loss: 0.024270527064800262\n",
      "19/5877/5000 loss: 0.055694155395030975\n",
      "19/5877/5200 loss: 0.28471606969833374\n",
      "19/5877/5400 loss: 0.015970714390277863\n",
      "19/5877/5600 loss: 0.004445639438927174\n",
      "19/5877/5800 loss: 0.06398807466030121\n"
     ]
    }
   ],
   "source": [
    "\n",
    "net = GenderModule()\n",
    "lost_func = nn.CrossEntropyLoss()\n",
    "op = optim.Adam(params=net.parameters(), lr=0.0002)\n",
    "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
    "net.to(device)\n",
    "print(\"use {}\".format(device))\n",
    "# 将窗口类实例化\n",
    "viz = Visdom()\n",
    "\n",
    "# 创建窗口并初始化\n",
    "loss_win = viz.line([0.], [0], win='loss', opts=dict(title='loss'))\n",
    "acc_win = viz.line([0.],[0],win='acc',opts=dict(title='acc'))\n",
    "\n",
    "for i in range(20):\n",
    "    train_rights = []\n",
    "\n",
    "    for inx, (data, label) in enumerate(training_male_dataset):\n",
    "        data = data.to(device)\n",
    "        label = label.to(device)\n",
    "        output = net(data)\n",
    "        # output.to(\"cpu\")\n",
    "        loss = lost_func(output, label)\n",
    "        # loss.to(\"cpu\")\n",
    "        op.zero_grad()\n",
    "        loss.backward()\n",
    "        op.step()\n",
    "        right = accury(output, labels=label)\n",
    "        train_rights.append(right)\n",
    "\n",
    "        if inx % 200 == 0:\n",
    "            viz.line(Y=torch.Tensor([loss]), X=torch.Tensor([inx +(len(training_male_dataset)*i)]), win=loss_win, update='append')\n",
    "            # viz.line(Y=torch.Tensor(right), X=torch.Tensor([inx +(len(training_male_dataset)*i)]), win=acc_win, update='append')\n",
    "            print(\"{}/{}/{} loss: {}\".format(i, len(training_male_dataset), inx, loss))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "torch.save(net.state_dict,os.path.join(os.getcwd(),\"gener.pth\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "img = cv2.imread(\"Validation/female/112944.jpg.jpg\")\n",
    "plt.imshow(img)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([56, 56, 3])\n",
      "torch.Size([1, 3, 56, 56])\n"
     ]
    }
   ],
   "source": [
    "print(img.shape)\n",
    "t_img = img.permute(2,0,1).view(1,3,56,56)\n",
    "print(t_img.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "ename": "RuntimeError",
     "evalue": "Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! (when checking argument for argument weight in method wrapper_CUDA___slow_conv2d_forward)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mRuntimeError\u001b[0m                              Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[36], line 2\u001b[0m\n\u001b[1;32m      1\u001b[0m t_img\u001b[39m.\u001b[39mto(device)\n\u001b[0;32m----> 2\u001b[0m net(t_img)\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1499\u001b[0m         \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1500\u001b[0m         \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m     \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m   1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m   1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n",
      "Cell \u001b[0;32mIn[4], line 19\u001b[0m, in \u001b[0;36mGenderModule.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m     18\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39mself\u001b[39m, x):\n\u001b[0;32m---> 19\u001b[0m     x \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mconv1(x)\n\u001b[1;32m     20\u001b[0m     x \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mconv2(x)\n\u001b[1;32m     21\u001b[0m     x \u001b[39m=\u001b[39m x\u001b[39m.\u001b[39mview(x\u001b[39m.\u001b[39msize(\u001b[39m0\u001b[39m), \u001b[39m-\u001b[39m\u001b[39m1\u001b[39m)\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1499\u001b[0m         \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1500\u001b[0m         \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m     \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m   1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m   1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/torch/nn/modules/container.py:217\u001b[0m, in \u001b[0;36mSequential.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m    215\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39minput\u001b[39m):\n\u001b[1;32m    216\u001b[0m     \u001b[39mfor\u001b[39;00m module \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m:\n\u001b[0;32m--> 217\u001b[0m         \u001b[39minput\u001b[39m \u001b[39m=\u001b[39m module(\u001b[39minput\u001b[39;49m)\n\u001b[1;32m    218\u001b[0m     \u001b[39mreturn\u001b[39;00m \u001b[39minput\u001b[39m\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1499\u001b[0m         \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1500\u001b[0m         \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m     \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m   1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m   1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/torch/nn/modules/conv.py:463\u001b[0m, in \u001b[0;36mConv2d.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m    462\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39minput\u001b[39m: Tensor) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m Tensor:\n\u001b[0;32m--> 463\u001b[0m     \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_conv_forward(\u001b[39minput\u001b[39;49m, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mweight, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mbias)\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/torch/nn/modules/conv.py:459\u001b[0m, in \u001b[0;36mConv2d._conv_forward\u001b[0;34m(self, input, weight, bias)\u001b[0m\n\u001b[1;32m    455\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpadding_mode \u001b[39m!=\u001b[39m \u001b[39m'\u001b[39m\u001b[39mzeros\u001b[39m\u001b[39m'\u001b[39m:\n\u001b[1;32m    456\u001b[0m     \u001b[39mreturn\u001b[39;00m F\u001b[39m.\u001b[39mconv2d(F\u001b[39m.\u001b[39mpad(\u001b[39minput\u001b[39m, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_reversed_padding_repeated_twice, mode\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpadding_mode),\n\u001b[1;32m    457\u001b[0m                     weight, bias, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstride,\n\u001b[1;32m    458\u001b[0m                     _pair(\u001b[39m0\u001b[39m), \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdilation, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mgroups)\n\u001b[0;32m--> 459\u001b[0m \u001b[39mreturn\u001b[39;00m F\u001b[39m.\u001b[39;49mconv2d(\u001b[39minput\u001b[39;49m, weight, bias, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mstride,\n\u001b[1;32m    460\u001b[0m                 \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mpadding, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdilation, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mgroups)\n",
      "\u001b[0;31mRuntimeError\u001b[0m: Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! (when checking argument for argument weight in method wrapper_CUDA___slow_conv2d_forward)"
     ]
    }
   ],
   "source": [
    "t_img = t_img.to(device)\n",
    "net(t_img)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "opencv-demo",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
